package com.ztr.excel.api;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.ztr.excel.Constants;
import com.ztr.excel.bo.UserInfoBO;
import com.ztr.excel.enums.ExcelExportFileTypeEnum;
import com.ztr.excel.enums.ExcelImportFileTypeEnum;
import com.ztr.excel.utils.ExcelUtil;
import org.apache.commons.compress.utils.Lists;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;

import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 * 测试接口
 * </p>
 */
@Slf4j
@RestController
@RequestMapping("/api/test")
public class ApiController {

    /**
     * 导出用户信息数据为Excel文件。
     * 该方法通过遍历模拟生成用户信息列表，并将这些数据转换为Excel格式，最后通过HTTP响应发送给客户端。
     * 使用了JSON的序列化和反序列化来转换数据格式，以及ExcelUtil工具类来处理Excel的导出。
     *
     * @param response HTTP响应对象，用于将生成的Excel文件发送给客户端。
     */
    @GetMapping("/exportData")
    public void exportData(HttpServletResponse response) {
        // 初始化用户信息列表，用于存储模拟的用户数据。
        List<UserInfoBO> userInfoList = Lists.newArrayList();
        // 模拟生成10条用户信息数据。
        for (int i = 1; i <= 10; i++) {
            userInfoList.add(new UserInfoBO(String.valueOf(i), "张三" + i, String.valueOf(i * 10)));
        }
        // 将UserInfoBO对象列表转换为Map列表，以便于ExcelUtil处理。
        // 这里使用了JSON的序列化和反序列化来进行类型转换。
        List<Map<String, Object>> dataList =
                JSON.parseObject(JSON.toJSONString(userInfoList), new TypeReference<List<Map<String, Object>>>() {
                });
        // 调用ExcelUtil的导出方法，将数据导出为Excel文件，并通过HTTP响应发送给客户端。

        ExcelUtil.export(dataList, ExcelExportFileTypeEnum.测试, Constants.FILE_PATH_TEST_EXPORT_EXCEL, response);
    }


    /**
     * 处理数据导入请求。
     * 该方法旨在接收上传的文件，并将其内容解析为用户信息列表。
     * 目前实现中，方法模拟了文件上传的过程，直接从本地文件系统读取数据，
     * 并使用ExcelUtil进行解析。
     *
     * @param file 上传的文件，此处未强制要求必须提供，允许为空。
     * @return 返回处理结果字符串。在异常情况下，返回异常信息；成功时，返回"SUCCESS"。
     */
    @GetMapping("/importData")
    public String importData(@RequestParam(value = "file", required = false) MultipartFile file) {
        List<UserInfoBO> userInfoList = Lists.newArrayList();
        try {
            // 创建一个本地文件实例，用于后续读取测试数据。
            // 本地File文件转MultipartFile作临时测试前端上传文件导入数据
            File fileLocal = FileUtil.newFile(Constants.FILE_PATH_TEST_EXPORT_EXCEL);
            // 创建文件输入流，用于读取本地文件内容。
            InputStream inputStream = new FileInputStream(fileLocal);
            // 创建一个模拟MultipartFile对象，用于包裹文件输入流。
            MultipartFile multipartFile = new MockMultipartFile(fileLocal.getName(), inputStream);
            // 使用ExcelUtil解析上传的文件，将解析结果存储在userInfoList中。
            ExcelUtil.read(userInfoList, ExcelImportFileTypeEnum.测试, multipartFile, true);
            // 打印解析结果，用于调试。
            System.out.println(userInfoList);
        } catch (Exception e) {
            // 捕获处理过程中可能出现的任何异常，并返回异常信息。
            return e.getMessage();
        }
        // 如果处理过程中没有发生异常，返回"SUCCESS"表示操作成功。
        return "SUCCESS";
    }

}
